<feed xmlns='http://www.w3.org/2005/Atom'>
<title>opencut/apps/web/src/app/editor/[project_id]/page.tsx, branch main</title>
<subtitle></subtitle>
<id>http://git.cashmere.rs/opencut/atom/apps/web/src/app/editor/[project_id]/page.tsx?h=main</id>
<link rel='self' href='http://git.cashmere.rs/opencut/atom/apps/web/src/app/editor/[project_id]/page.tsx?h=main'/>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/'/>
<updated>2026-07-30T16:18:15Z</updated>
<entry>
<title>feat: Electron desktop app, native ffmpeg export, fully static web</title>
<updated>2026-07-30T16:18:15Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-07-30T16:17:45Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=ed02ba872c02eafed45f406c68d389d0a1112a4e'/>
<id>urn:sha1:ed02ba872c02eafed45f406c68d389d0a1112a4e</id>
<content type='text'>
- apps/desktop: Electron shell serving the static web build over a
  privileged opencut:// protocol; exports stream frames over IPC to a
  bundled ffmpeg (libx264/libvpx-vp9, BT.709 tagged) with backpressure.
  electron-builder packaging: AppImage, deb, rpm.
- apps/web: dead backend deleted (better-auth, drizzle/pg, upstash,
  botid, freesound proxy, blog, rss, env validation); next build emits
  a zero-env static export; /editor/[project_id] -&gt; /editor?project=.
- Native exporter mirrors SceneExporter; activates when the preload
  bridge is present; web keeps the mediabunny path.
- Docker self-hosting now builds and serves the static export via nginx.
- Release workflow: v* tags publish static web tarball + Linux packages.
- Changelog 0.4.0; README/AGENTS/CONTRIBUTING/roadmap updated.
- GPUI/Rust rewrite parked on branch rust-rewrite.
</content>
</entry>
<entry>
<title>feat: ripple-extend resize, timeline filmstrip, export hardening</title>
<updated>2026-07-28T17:41:14Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-07-28T17:41:14Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=e837e7504379e100ff3b56282577ec67bb88bec9'/>
<id>urn:sha1:e837e7504379e100ff3b56282577ec67bb88bec9</id>
<content type='text'>
Yesterday's verified web session (gates green: 316 tests, tsc, build):
- ripple-extend pushes right-hand chain on static-element resize
- per-position video filmstrip thumbnails with zoom-adaptive density
- fps-aware export bitrate, 2s keyframes, even-dim export canvas
- freeze frame uses fixed 3s duration, prompt removed
</content>
</entry>
<entry>
<title>feat: freeze-duration prompt</title>
<updated>2026-07-26T23:21:02Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-07-26T23:21:02Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=2bbada7d2c5c00c5f844b6916c08bc4a9ea8cb25'/>
<id>urn:sha1:2bbada7d2c5c00c5f844b6916c08bc4a9ea8cb25</id>
<content type='text'>
Freeze frame now asks for the duration (decimal seconds, 0 &lt; d &lt;= 600)
before capture, via a promise-based zustand store mounted as an
editor-global dialog. Last-used duration persists and prefills. Cancel
aborts before capture with no commands.
</content>
</entry>
<entry>
<title>chore: switch from biome to eslint + prettier; fix ton of lint issues</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-28T22:37:56Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=a9b9cf6bf50f08723896659634f2e6afc17bcd42'/>
<id>urn:sha1:a9b9cf6bf50f08723896659634f2e6afc17bcd42</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor: restructure files to their domains,  new preview overlay system, and dep graph</title>
<updated>2026-04-20T09:31:17Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-20T09:31:17Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=3e89d2998588f8e35c524e523ba2ee853f0f6475'/>
<id>urn:sha1:3e89d2998588f8e35c524e523ba2ee853f0f6475</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: new-release notice and colocate changelog under domain</title>
<updated>2026-04-15T00:05:41Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-15T00:05:41Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=370944f443cb997ef71dda0c8ef6f4e92bea87d7'/>
<id>urn:sha1:370944f443cb997ef71dda0c8ef6f4e92bea87d7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix: text measurement, rotation handle, video cache races, playback sync</title>
<updated>2026-04-13T03:08:29Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-13T02:41:33Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=7d4e166678c35d48b22b8d1d05639f981a956a8b'/>
<id>urn:sha1:7d4e166678c35d48b22b8d1d05639f981a956a8b</id>
<content type='text'>
Made-with: Cursor
</content>
</entry>
<entry>
<title>chore: normalize line endings</title>
<updated>2026-03-29T13:56:48Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-03-26T23:55:15Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=4d127a038bf768eded68aae3cfa5c1b12241bdac'/>
<id>urn:sha1:4d127a038bf768eded68aae3cfa5c1b12241bdac</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: mobile gate</title>
<updated>2026-03-02T09:36:19Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-03-02T09:36:19Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=82f8f76a844db0b6f10bec9a07ac67a45ad5df5a'/>
<id>urn:sha1:82f8f76a844db0b6f10bec9a07ac67a45ad5df5a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: major editor overhaul (assets, properties, timeline, fonts) (#709)</title>
<updated>2026-02-23T02:24:02Z</updated>
<author>
<name>Maze</name>
<email>167211895+mazeincoding@users.noreply.github.com</email>
</author>
<published>2026-02-23T02:24:02Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=93d1e3383ce47e45157d70f9ba6251239dae6bc2'/>
<id>urn:sha1:93d1e3383ce47e45157d70f9ba6251239dae6bc2</id>
<content type='text'>
* feat: major editor overhaul (assets, properties, timeline, fonts)

Refactor editor core systems to standardize UI architecture and improve performance.

Assets &amp; Properties:
- Replace monolithic property items with composable `Section` architecture.
- Add specialized sections for Transform, Blending, and Text.
- Implement `NumberField` with scrubbing and math evaluation.
- Add new ColorPicker with EyeDropper and multiple format support.
- Standardize asset panels using new `PanelView` layout.

Fonts &amp; Stickers:
- Implement custom font atlas/sprite system for high-performance previews.
- Add virtualized FontPicker with search and favorites.
- Refactor stickers to use a provider-based architecture (icons, emoji, flags, shapes).
- Standardize sticker IDs to `provider:value` format.

Timeline &amp; Interaction:
- Convert bookmarks to rich objects with notes, colors, and duration.
- Refactor drag-and-drop to use Command pattern (enabling proper undo/redo).
- Add Shift modifier to disable snapping during moves/resizes.
- Add new overlays for layout guides and text editing.

Renderer:
- Add support for multi-line text, custom line-height, and letter-spacing.
- Implement global composite operation (blend modes).
- Update sticker node to resolve dynamic provider IDs.

Infrastructure:
- Add storage migrations (v3-&gt;v6) for text weights, sticker IDs, and bookmarks.
- Update global styles and core UI components (Button, Input, Popover).

* add ts-nocheck directive to settings-legacy.tsx to suppress TypeScript errors

* fix: correct global composite operation assignment in TextNode to ensure proper blend mode handling

* deleted shadcn components with errors

* formatting

* fix linter issues

* migrate from next middleware to proxy

* add missing component back

* add breadcrumb back

* chore: add @radix-ui/react-primitive deps

* chore: more deps

* chore: add missing env vars to bun-ci

* next env</content>
</entry>
</feed>
